任务计划:校园智巡 v2 升级路线图
创建时间: 2026-06-21
预计总工期: 2.5-4 周(视每日可用时间而定)
目标平台: Intel N100 Mini PC (Ubuntu 22.04),替换 Xavier NX
阶段概览
阶段 0 ──→ 阶段 1 ──→ 阶段 2 ──→ 阶段 3 ──→ 阶段 4 ──→ 阶段 5
N100 环境 FAST-LIO2 EKF集成 导航联调 鲁棒性 收尾优化
搭建与迁移 独立验证 与改造 与标定 测试 与文档
(2-3天) (2-3天) (2天) (3-4天) (2-3天) (1-2天)每个阶段有明确的完成标准(Done Criteria),必须全部达标才进入下一阶段。
阶段 0:N100 环境搭建与迁移(2-3 天)
目标:在 N100 上搭建完整的 ROS2 Humble 环境,迁移所有驱动和配置,确认 v1 系统(不含 FAST-LIO2)能在 N100 上正常运行。
任务 0.1:安装 ROS2 Humble
N100 已有 Ubuntu 22.04,直接原生安装:
# 设置 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
# 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
-o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
http://packages.ros.org/ros2/ubuntu jammy main" | \
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 安装
sudo apt update
sudo apt install ros-humble-desktop
sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup
sudo apt install ros-humble-robot-localization
sudo apt install ros-humble-tf-transformations
sudo apt install python3-colcon-common-extensions
# 验证
source /opt/ros/humble/setup.bash
ros2 topic list任务 0.2:迁移 workspace 源码
从 Xavier NX 或 GitHub 拉取所有 workspace:
mkdir -p ~/ros2_ws/workspace && cd ~/ros2_ws/workspace
# 方式 A:从 Xavier NX 直接 scp
scp -r iot@<xavier_ip>:/ros2_ws/workspace/myslam_car .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/livox .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/rtk_um982 .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/spatio_temporal .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/carplanning_code .
# 方式 B:从 GitHub 克隆(如果都推过远程)
git clone <url> carplanning_code && cd carplanning_code && git checkout hardware
# ... 其他 workspace任务 0.3:编译所有 workspace
source /opt/ros/humble/setup.bash
# 按依赖顺序编译
cd ~/ros2_ws/workspace/livox && colcon build
cd ~/ros2_ws/workspace/myslam_car && colcon build
cd ~/ros2_ws/workspace/rtk_um982 && colcon build
cd ~/ros2_ws/workspace/spatio_temporal && colcon build
# 主包
cd ~/ros2_ws/workspace/carplanning_code
source ~/ros2_ws/workspace/livox/install/setup.bash
source ~/ros2_ws/workspace/myslam_car/install/setup.bash
source ~/ros2_ws/workspace/rtk_um982/install/setup.bash
source ~/ros2_ws/workspace/spatio_temporal/install/setup.bash
colcon build --packages-select carplanning_code注意:在 x86 上编译这些包应该比 ARM 顺利得多。如果有编译错误,大概率是缺少 apt 依赖,按报错信息 sudo apt install 即可。STVL 在 Xavier NX 上曾有 ARM 编译问题,在 x86 上不会有。
任务 0.4:硬件接线与 udev 规则
把 USB 设备从 Xavier NX 拔下来接到 N100:
# 查看 USB 设备
lsusb
ls /dev/ttyUSB* # 或 /dev/ttyACM*
# 获取设备 serial ID
udevadm info -a /dev/ttyUSB0 | grep serial
# 创建 udev 规则(根据实际 serial ID 修改)
sudo tee /etc/udev/rules.d/99-robot.rules << 'EOF'
# UM982 RTK GPS
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", \
ATTRS{serial}=="XXXXXXXX", SYMLINK+="rtk1", MODE="0666"
# STM32 底盘控制器
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", \
ATTRS{serial}=="XXXXXXXX", SYMLINK+="stm32", MODE="0666"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger
# 验证
ls -la /dev/rtk1 /dev/stm32任务 0.5:配置 Livox 以太网
N100 的以太网口需要配置静态 IP 与 Livox Mid-360 通信:
# 方式 A:nmcli(推荐)
sudo nmcli con add type ethernet ifname <eth_interface> con-name livox \
ipv4.addresses 192.168.1.50/24 ipv4.method manual
# 方式 B:netplan(如果用 netplan)
# 编辑 /etc/netplan/01-livox.yaml验证:
ping 192.168.1.140 # Livox 默认 IP
# 如果能 ping 通,说明网络配置正确任务 0.6:v1 全栈启动测试
在 N100 上启动 v1 的全部系统(不含 FAST-LIO2),确认所有传感器和导航正常:
ros2 launch carplanning_code bringup.launch.py检查:
- 底盘驱动:
ros2 topic hz /odom显示 10Hz - IMU:
ros2 topic hz /imu/data_raw显示 10Hz - LiDAR:
ros2 topic hz /livox/lidar显示 10Hz - GPS:
ros2 topic hz /gps/fix显示 10-20Hz - EKF:
ros2 topic hz /odometry/filtered正常输出 - Nav2:
ros2 topic list | grep -c nav显示多个 Nav2 话题 - GPS 监控:
python3 scripts/gps_monitor_v2.py --no-csv显示 RTK_FIXED - CPU 占用:
htop确认总 CPU < 80%
阶段 0 完成标准
- ROS2 Humble 原生安装在 N100 上
- 所有 workspace 编译通过
- USB 设备(GPS、底盘)正确绑定
- Livox 以太网通信正常
- v1 全栈可以在 N100 上正常启动和运行
- CPU 使用率有明显余量(< 80%)
阶段 1:FAST-LIO2 独立编译与验证(2-3 天)
目标:确认 FAST-LIO2 能在 N100 上跑起来,正确订阅 Livox Mid-360 和 IMU,输出合理的里程计数据。这个阶段不碰 EKF 和 Nav2。
任务 1.1:选择 ROS2 Humble 移植版本
搜索 GitHub 上 FAST-LIO2 的 ROS2 Humble 移植版,筛选标准:
- 明确支持 ROS2 Humble
- 有 Livox 点云格式支持(
livox_ros_driver2兼容) - 有近期维护(最近 6 个月内有 commit)
- 在 x86 Ubuntu 22.04 上验证过
任务 1.2:编译
# 安装依赖
sudo apt install libeigen3-dev libpcl-dev ros-humble-pcl-conversions
cd ~/ros2_ws/workspace
git clone <选定的仓库> fast_lio2
cd fast_lio2
source /opt/ros/humble/setup.bash
source ~/ros2_ws/workspace/livox/install/setup.bash
colcon build --packages-select fast_liox86 平台上编译应该不会遇到 ARM 特有的问题。如果有报错,通常就是缺少 apt 依赖。
任务 1.3:配置 Livox Mid-360 参数
创建 FAST-LIO2 的 YAML 配置文件,设置:
lidar_type: Livox- 点云话题:
/livox/lidar - IMU 话题:
/imu/data_raw - LiDAR-IMU 外参初始值: 平移
[0.14, 0.0, 0.12] - IMU 噪声参数: 底盘 MEMS 典型值
任务 1.4:室外静态测试
不启动 Nav2 和 EKF,只启动底盘 + Livox + FAST-LIO2:
# 终端 1
ros2 launch myslam_car driver.launch.py
# 终端 2
ros2 launch carplanning_code mid360.launch.py
# 终端 3
ros2 launch fast_lio mapping.launch.py检查项:
- FAST-LIO2 启动无 crash
ros2 topic hz /lio_odom显示 ~10Hz- 静止时位置漂移 < 5cm/分钟
- 静止时 yaw 漂移 < 1°/分钟
htop确认 FAST-LIO2 CPU 占用 < 40%
任务 1.5:室外动态测试
手动遥控机器人走 5m × 5m 矩形路径,回到起点:
- 终点与起点位置误差 < 20cm
- 直线行驶轨迹不弯曲
- 转弯 90° 时 yaw 变化约 90°
如果 10Hz IMU 导致效果不佳:
- 选项 A:外接独立 IMU(BNO055 USB, 100Hz)
- 选项 B:修改底盘驱动提高 IMU 发布频率
- 选项 C:放弃 FAST-LIO2,换用 KISS-ICP(不需要 IMU)
阶段 1 完成标准
- FAST-LIO2 编译通过并可运行
- 静止:1 分钟漂移 < 5cm + yaw < 1°
- 动态:5m×5m 矩形闭环误差 < 20cm
- CPU 占用可接受
- 输出 Odometry 消息格式确认
阶段 2:EKF 集成与改造(2 天)
目标:把 FAST-LIO2 接入 EKF,替代轮式里程计,与 RTK-GPS 融合。
任务 2.1:修改 ekf.yaml
# odom0: 轮式里程计 → FAST-LIO2
odom0: /lio_odom
odom0_config: [false,false,false, false,false,false,
true, true, false, false,false,true,
false,false,false]
# 移除 imu0(已在 FAST-LIO2 内部融合)
# odom1: GPS 保持不变
odom1: /odometry/gps
# 频率提高
frequency: 10.0
sensor_timeout: 0.3任务 2.2:修改 bringup.launch.py
- t=3s 添加 FAST-LIO2 启动
- EKF 延迟到 t=6s
- 决定是否保留
covariance_relay.py
任务 2.3:TF 冲突排查
- 确认 FAST-LIO2 配置为不发布 TF
ros2 run tf2_tools view_frames检查 TF 树
任务 2.4:融合效果验证
启动定位全栈(不启动 Nav2),手动遥控:
- EKF 输出 ≥ 10Hz
- TF 树正确
- RViz 中运动方向与真实世界一致
- 无 "Failed to meet update rate" 警告
阶段 2 完成标准
- EKF 稳定融合 LIO + GPS
- TF 树无冲突
- 手动遥控时 RViz 表现正确
- 静止时位置稳定
阶段 3:导航联调与标定(3-4 天)
目标:接入 Nav2 全栈,完整导航测试。
任务 3.1:Nav2 频率调整
N100 算力更充足,可以适当提高:
controller_frequency: 15.0 # 10→15Hz
transform_tolerance: 0.3 # 0.5→0.3s任务 3.2:yaw_offset 标定
让机器人面朝已知方向,检查 RViz 中 map 坐标系方向是否正确,调整 yaw_offset。
任务 3.3:短距离导航测试(5m)
- 路径规划正确
- 机器人沿路径行驶,不振荡
- 到达目标误差 < 0.5m
- 代价地图不旋转
任务 3.4:中距离导航测试(20m)
- 遇障碍物时重新规划
- 绕障后回到正确路径
- 不原地打转
- 不进入 recovery 循环
任务 3.5:DWB 参数调优
如果跟踪不满意,调整 PathAlign/GoalAlign/PathDist/GoalDist 权重。
阶段 3 完成标准
- 5m 导航:成功到达,跟踪误差 < 30cm
- 20m 导航:成功到达,能避障
- 代价地图方向正确
- 无 recovery 循环
阶段 4:鲁棒性测试(2-3 天)
目标:验证 GPS 降级、复杂环境等非理想条件下的表现。
任务 4.1:GPS 降级测试
导航过程中断开 NTRIP,观察:
- GPS 降级瞬间不剧烈跳动
- 导航继续工作 ≥ 2 分钟
- GPS 恢复后自动修正
任务 4.2:GPS 完全丢失测试
关闭 GPS 驱动,记录纯 LIO 模式下的持续时间和精度。
任务 4.3:复杂环境导航
多障碍物、拐角、窄通道测试。
任务 4.4:长时间运行(30 分钟+)
- 内存稳定(ikd-Tree 无泄漏)
- CPU 稳定
- 导航精度不随时间下降
阶段 4 完成标准
- GPS 降级可工作 ≥ 2 分钟
- 复杂环境成功率 ≥ 70%
- 30 分钟无 crash
阶段 5:收尾(1-2 天)
任务 5.1:参数固化与备份
任务 5.2:监控工具更新
ekf_probe.py添加/lio_odom监控- 考虑添加 FAST-LIO2 健康检查
任务 5.3:文档更新
CLAUDE.md、README.md- 已知问题和调优记录
任务 5.4:Git 管理
- 所有变更提交到
hardware分支 - 创建
v2tag
阶段 5 完成标准
- 一键启动全栈
- 文档完整
- Git 提交整洁
风险与备选方案
| 风险 | 概率 | 影响 | 备选方案 |
|---|---|---|---|
| FAST-LIO2 ROS2 Humble 编译失败 | 低(x86 比 ARM 容易很多) | 高 | 尝试其他 fork;或用 KISS-ICP 替代 |
| 底盘 10Hz IMU 不够 FAST-LIO2 使用 | 中 | 高 | 换 KISS-ICP(不需要 IMU);或加独立 IMU |
| N100 算力不够跑全栈 | 低(v1 在 Xavier NX 上都能跑) | 中 | 降低 FAST-LIO2 点云密度;或降低 Nav2 频率 |
| LiDAR-IMU 外参标定困难 | 中 | 中 | 手动测量 + 迭代调整;或用 LI-Init 工具 |
| N100 供电问题 | 低 | 中 | 确认 DC-DC 模块输出稳定 12V |
需要修改的文件清单
| 文件 | 改动内容 | 阶段 |
|---|---|---|
config/ekf.yaml | odom0→LIO,移除 imu0,频率→10Hz | 阶段 2 |
config/nav2_params.yaml | 提高频率、收紧 transform_tolerance | 阶段 3 |
launch/bringup.launch.py | 添加 FAST-LIO2,调整时序 | 阶段 2 |
config/fastlio2.yaml (新) | FAST-LIO2 配置 | 阶段 1 |
/etc/udev/rules.d/99-robot.rules | N100 的 USB 设备绑定 | 阶段 0 |
scripts/ekf_probe.py | 添加 /lio_odom 监控 | 阶段 5 |
CLAUDE.md | 更新架构描述 | 阶段 5 |
每日建议节奏
如果每天有 3-4 小时可用时间:
- 第 1-3 天:阶段 0(ROS2 安装、编译、接线、v1 验证)
- 第 4-5 天:阶段 1 前半(FAST-LIO2 编译、配置)
- 第 6-7 天:阶段 1 后半(室外静态/动态测试)
- 第 8-9 天:阶段 2(EKF 集成、TF 排查)
- 第 10-13 天:阶段 3(导航联调、标定、参数调优)
- 第 14-16 天:阶段 4(鲁棒性测试)
- 第 17-18 天:阶段 5(收尾)
